package org.lzfto.flink.demo.common.data;

import java.util.List;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

public class PagingOperation {
	protected static JdbcTemplate jdbcTemplate;
	
	public static void  setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		PagingOperation.jdbcTemplate=jdbcTemplate;
	}
	/*public PagingOperation(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}*/

	/**
	 * 查询并返回分页数据
	 * 
	 * @param <T> 返回结果类型
	 * @param pageNo 页码 非空
	 * @param pageSize 每页大小 非空
	 * @param totalSql 总数查询SQL  形如 select count(*) from xxx where ...
	 * @param querySql 数据查询SQL  形如 select c1,c2,c3..cn from xxx where 1=1 ...
	 * @param args 参数列表，注意该参数会被修改.非空
	 * @param clazz 返回结果类型Class对象
	 * @return 分页数据对象
	 */
	public <T> PageData<T> buildPage(int pageNo, int pageSize, String totalSql, String querySql, List<Object> args, Class<T> clazz) {
		int total = jdbcTemplate.queryForObject(totalSql, Integer.class, args.toArray());
		String realPageSql = querySql + " LIMIT ?,?";
		args.add((pageNo - 1) * pageSize);
		args.add(pageSize);
		BeanPropertyRowMapper<T> rowMapper = new BeanPropertyRowMapper<>(clazz);
		List<T> list = jdbcTemplate.query(realPageSql, rowMapper, args.toArray());
		PageData<T> result=new PageData<T>();
		result.setPageNo(pageNo);
		result.setPageSize(pageSize);
		result.setTotal(total);
		result.setRows(list);
		return result;
	}

	/**
	 * 查询并返回分页数据
	 * 
	 * @param <T> 返回结果类型
	 * @param pageNo 页码 非空
	 * @param pageSize 每页大小 非空
	 * @param totalSql 总数查询SQL  形如 select count(*) from xxx where ...
	 * @param querySql 数据查询SQL  形如 select c1,c2,c3..cn from xxx where 1=1 ...
	 * @param args 参数列表，注意该参数会被修改.非空
	 * @param clazz 返回结果类型Class对象
	 * @param calTotal 是否计算总数，默认为true
	 * @return 分页数据对象
	 */
	public <T> PageData<T> buildPage(int pageNo, int pageSize, String totalSql, String querySql, List<Object> args, Class<T> clazz,Boolean calTotal) {
		PageData<T> result=new PageData<T>();
		if (calTotal){
           int total = jdbcTemplate.queryForObject(totalSql, Integer.class, args.toArray());
		   result.setTotal(total);
		}
		
		String realPageSql = querySql + " LIMIT ?,?";
		args.add((pageNo - 1) * pageSize);
		args.add(pageSize);
		BeanPropertyRowMapper<T> rowMapper = new BeanPropertyRowMapper<>(clazz);
		List<T> list = jdbcTemplate.query(realPageSql, rowMapper, args.toArray());
		result.setPageNo(pageNo);
		result.setPageSize(pageSize);
		result.setRows(list);
		return result;
	}
}
